使用 +,比如 String s = "Hello " + “World!”。 使用 String 类的 concat() 方法。
访问修饰符 | 本类 | 同包 | 子类 | 其他 | 说明 |
---|---|---|---|---|---|
private | √ | private修饰的属性或者方法,只能在当前类中访问或者使用。 | |||
默认 | √ | √ | 默认是什么修饰符都不加,默认在当前类中和同一包下都可以访问和使用。 | ||
protected | √ | √ | √ | protected修饰的属性或者方法,对同一包内的类和所有子类可见。 | |
public | √ | √ | √ | √ | public修饰的属性或者方法,对所有类可见。 |
public class Test {
void f(int a){
System.out.println("i = " + a);
}
void f(float i){
System.out.println("f = " + i);
}
void f(String s){
System.out.println("s = " + s);
}
void f(String s1, String s2){
System.out.println("s1 + s2 = " + s1 + s2);
}
void f(String s1, int a){
System.out.println("s = " + s1+", i = " + a);
}
public static void main(String[] args){
Test test = new Test();
test.f(2345);
test.f(34.56f);
test.f("abc");
test.f("abc", "def");
test.f("abc",3456);
}
}
public class Animal {
public int legNum;
public void bark(){
System.out.println("动物叫");
}
}
public class Dog extends Animal {
public void bark(){
System.out.println("狗叫");
}
}
class Animal{
public void bark(){
System.out.println("动物叫");
}
}
class Dog extends Animal{
public void bark(){
System.out.println("汪汪汪");
}
public void dogType(){
System.out.println("这是什么品种的狗!");
}
}
public class Test {
public static void main(String[] args){
Animal a = new Animal();
Animal b = new Dog();
Dog c = new Dog();
a.bark();
b.bark();
c.dogType();
}
}
public abstract class TelePhone {
public abstract void call();
public abstract void message();
}
public class CellPhone extends TelePhone {
public void call(){
System.out.println("I can make a telephone call.");
}
public void message(){
System.out.println("I can send a message.");
}
public static void main(String[] args){
CellPhone a = new CellPhone();
a.call();
a.message();
}
}
在 Java8 中:
在 Java9 中,接口可以拥有私有方法和私有静态方法,但是只能被该接口中的 default 方法和静态方法使用。
通过接口实现多继承:
修饰符 interface A extends 接口1,接口2{
}
修饰符 class A implements 接口1,接口2{
}
public interface Animal {
int leg = 5;
public void eat();
public void travel();
}
public class Cat implements Animal {
public void eat(){
System.out.println("Eat!");
}
public void travel(){
System.out.println("Travel.");
}
public static void main(String[] args){
Cat a = new Cat();
a.eat();
a.travel();
}
}
注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为 outer 的外部类和其内部定义的名为 inner 的内部类。编译完成后出现 outer.class 和 outer$inner.class 两类。所以内部类的成员变量 / 方法名可以和外部类的相同。
public class People {
private String name = "lili";
public class Student {
String id = "20201212";
public void stuinfo(){
System.out.println("访问外部类中的name:" + name);
System.out.println("访问内部类的ID:" + id);
}
}
public static void main(String[] args){
People a = new People();
Student b = a.new Student();
b.stuinfo();
}
}
成员内部类的使用方法:
注:成员内部类不能含有 static 的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的。
静态内部类是 static 修饰的内部类,这种内部类的特点是:
public class People {
private String name = "lilei";
static String ID = "630391197812151931";
public static class Student {
String ID = "20150815";
public void stuInfo(){
System.out.println("访问外部类中的 name :" + (new People().name));
System.out.println("访问外部类中的 ID:" + People.ID);
System.out.println("访问内部类中的 ID:" + ID);
}
}
public static void main(String[] args){
Student b = new Student();
b.stuInfo();
}
}
public class People {
public void peopleInfo(){
final String sex = "man";
class Student {
String ID = "20150815";
public void print(){
System.out.println("访问外部类的方法中的常量 sex :" + sex);
System.out.println("访问内部类中的变量ID:" + ID);
}
}
Student a = new Student();
a.print();
}
public void peopleInfo2(boolean b){
if(b){
final String sex = "man";
class Student {
String ID = "20151234";
public void print(){
System.out.println("访问外部类的方法中的常量 sex: " + sex );
System.out.println("访问内部类中的变量 ID:" + ID);
}
}
Student a = new Student();
a.print();
}
}
public static void main(String[] args){
People b = new People();
System.out.println("定义在方法内:==========");
b.peopleInfo();
System.out.println("定义在作用域内:+++++++++");
b.peopleInfo2(true);
}
}
public class Outer {
public Inner getInner(final String name, String city) {
return new Inner() {
private String nameStr = name;
private String cityName = city;
public String getName(){
return nameStr;
}
public String getCity(){
return cityName;
}
};
}
public static void main(String[] args){
Outer outer = new Outer();
Inner inner = outer.getInner("Inner", "NewYork");
System.out.println(inner.getName());
System.out.println(inner.getCity());
}
}
interface Inner {
String getName();
String getCity();
}
匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的, 如果不先定义,编译时会报错该类找不到。
同时,在上面的例子中,当所在的方法的形参需要在内部类里面使用时,该形参必须为 final。这里可以看到形参 name 已经定义为 final 了,而形参 city 没有被使用则不用定义为 final。
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。 包采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
如何在不同包中使用另一个包中的类?
使用 import 关键字。比如要导入包 com.shiyanlou 下 People 这个类,import com.shiyanlou.People;。同时如果 import com.shiyanlou.*; 这是将包下的所有文件都导入进来,* 是通配符。
包的命名规范是全小写字母拼写。
class Test<T> {
private T ob;
public Test(T ob){
this.ob = ob;
}
public T getOb(){
return ob;
}
public void setOb(T ob){
this.ob = ob;
}
public void showType(){
System.out.println("T的实际类型是:" + ob.getClass().getName());
}
}
public class TestDemo {
public static void main(String[] args){
Test<Integer> intOb = new Test<Integer>(88);
intOb.showType();
int i = intOb.getOb();
System.out.println("value = " + i);
System.out.println("----------------------------");
Test<String> strOb = new Test<String>("Hello Gen!");
strOb.showType();
String s = strOb.getOb();
System.out.println("value = " + s);
}
}