一、类与实例

类的定义:class 类名(一般大写字母开头,命名规则驼峰命名)

类是抽象概念:例如人类,是不存在的

Java实例在内存中吗 java 实例是什么_父类

Java实例在内存中吗 java 实例是什么_父类_02

classPerson{privateString name;private intage;public voidsetName(String name){if (name==null ||name.isEmpty()){throw new IllegalArgumentException("invalid name");
}this.name =name;
}public void setNameAndAge(String name,intage){this.name =name;this.age =age;
}public void setAge(intage){this.age =age;
}publicString getName(){return this.name;
}public intgetAge(){return this.age;
}
}

View Code

实例:类的具体化,例如:张三、李四

创建实例:类 实例名 = new 类();

访问实例变量:实例名.变量

Person ming = newPerson();//创建实例
ming.setName("小明");//调用实例方法
ming.setAge(12);
String name=ming.getName();int age = ming.getAge();

方法:

定义方法:

修饰符 方法返回类型 方法名(方法参数列表) {

若干方法语句;

return 方法返回值;

}

实例调用方法:实例.方法()

在方法内部可以使用this(代表实例)来访问类的属性和方法

//多个参数

public void setNameAndAge(String name,intage){this.name =name;this.age =age;
}privateString[] names;//可变类型 类型... 参数名 会转变为数组
public voidsetNames(String... names){this.names =names;
}

构造方法:

修饰符  类名(方法参数){}

构造方法作用:构造方法用来初始化实例,当类中没有构造方法时,系统中会默认创建一个没有参数没有任何执行语句的构造方法

构造方法调用:使用new操作符

构造方法定义:一个类中可以有多个构造方法,调用时会根据参数个数、位置、类型进行区分,类中构造函数还可以调用其他构造函数,使用this(参数)来调用

具体代码实现:

Java实例在内存中吗 java 实例是什么_父类

Java实例在内存中吗 java 实例是什么_父类_02

public classMain {public static voidmain(String[] args) {//调用没有参数的构造方法
Person ming = newPerson();
String name=ming.getName();int age =ming.getAge();
System.out.println(name+age);
}
}classPerson{privateString name;private intage;//构造方法 没有void修饰 方法名与类名相同 调用构造方法必须使用new操作符
public Person(String name,intage){this.name =name;this.age =age;
}//没有参数,没有执行语句的构造方法
publicPerson() {this("Unnamed");
}publicPerson(String name){//调用构造方法使用this(参数)
this(name,18);
}public voidsetName(String name){if (name==null ||name.isEmpty()){throw new IllegalArgumentException("invalid name");
}this.name =name;
}public void setNameAndAge(String name,intage){this.name =name;this.age =age;
}public void setAge(intage){this.age =age;
}publicString getName(){return this.name;
}public intgetAge(){return this.age;
}
}

View Code

方法重载:

packagecom.company;/*** @Time :2020/7/17 10:57
* @Description: 
* @作者 :aiyumo*/
public classMethodOverload {public static voidmain(String[] args){
String s= "Test string";int n1 = s.indexOf('t');int n2 = s.indexOf("st");int n3 = s.indexOf("st", 4);
System.out.println(n1);
System.out.println(n2);
System.out.println(n3);
}
}

类的继承

class 子类 extends 父类/基类/超类{}

所有的类默认都继承Object

子类继承父类的所有非private字段和方法除构造方法外,父类可以使用protected来修饰字段

子类访问父类的字段:super.fieldname、this.fieldname、fieldname  编译器会自动定位到父类中的字段

任何类的构造方法,第一行语句必须是调用父类的构造方法,如果没有,编译器会自动添加一个super()。在父类中存在非默认构造函数时,子类中的构造方法必须使用super(参数)来调用父类构造函数。

具体代码:

Java实例在内存中吗 java 实例是什么_父类

Java实例在内存中吗 java 实例是什么_父类_02

/*** @Time :2020/7/17 11:23
* @Description: 
* @作者 :aiyumo*/
public classExtendsTest {public static voidmain(String[] args){
Student stu= new Student("xiaoming",12,68);
stu.printParentField();
System.out.printf("%s,年龄:%d,成绩为%d",stu.name,stu.age,stu.score);
}
}classPerson2{protectedString name;protected intage;public Person2(String name, intage) {this.name =name;this.age =age;
}
}/*Student类继承了Person2类的所有字段与方法,
注意:子类不要定义与父类相同的字段,
子类不能访问父类的private字段和方法,用protected修饰的字段可以被子类访问
子类可以通过super.fieldName、this.name、name来访问父类的字段,其中super代表父类*/
class Student extendsPerson2{protected intscore;public voidprintParentField(){
System.out.println(this.name+this.age);
System.out.println(name+age);
System.out.println(super.name+super.age);
}public Student(String name,int age,intscore){/*任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();
如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的*/
super(name,age);//自动调用父类的构造方法
this.score =score;
}
}

View Code

类的强制转换

1、向上转型:把一个子类类型变为父类类型的赋值  子类>父类>Object

Person2 p = new Student("xiaoming",12,68); //父类

Student s= new Student("xiaowang",13,72); // 子类

Person2 p1=s;

Object o1=s;

Object o2= p;

2、向下转型:类类型强制转换为子类类型

向下转型时可以使用instanceof来判断类的实例是否是指定的类型  实例变量  instanceof  类型   return  bool

Person2 p2 = new Person2("xiaoli",14);
Student s1=(Student) p1;
Student s2= (Student) p2; //java.lang.ClassCastException
java14中可以使用  实例变量  instanceof  类型  类型变量     可以直接转换,避免后面强制转换
Person2 p3 = new Student("xiaozhang",14,72);//instanceof来判断变量指定的实例是否是指定的类型 实例 instanceof 类 返回bool
System.out.println(p3 instanceof Person2); //true
System.out.println(p3 instanceof Student); //false//java14后可以在判断时,直接转换 if (p3 instanceof Student s3)
if (p3 instanceofStudent){
Student s3=(Student) p3;
}