? 属性和方法
public class Person {
// 属性
String name;
int age;
// 方法
public void getInformation() {
System.out.println("name:" + name + ",age:" + age);
}
}
this:用于本类中,可以直接调用类中的属性和方法。调用类中的属性和方法也可以省略this关键字
// Person.java文件
public class Person {
String name;
int age;
public void getInformation() {
System.out.print("getInformation: name:" + this.name + ",age:" + this.age);
}
public void getInformation_1() {
System.out.println("\tgetInformation_1: name:" + name + ",age:" + age);
}
public void getPerson() {
this.getInformation();
getInformation_1();
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Person person = new Person();
person.name = "张三";
person.age = 18;
person.getPerson(); //getInformation: name:张三,age:18 getInformation_1: name:张三,age:18
}
}
? new以及构造方法
? 构造方法:
? 修饰符 类名(参数列表) {
? // 方法体
? }
? 举例1:默认存在无参构造方法,创建有参构造方法后,无参构造方法就不存在了,如果还需无参构造方法,重写。
// Teacher.java文件
public class Teacher {
String name;
int age;
}
// Student.java文件
public class Student{
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
// Person.java文件
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Person person1 = new Person("李四", 18);
Person person2 = new Person();//报错
Student student1 = new Student();
Student student2 = new Student("张三", 11);
}
}
前提:先看3.2的继承
举例2:在继承中,子类的构造方法会默认调用父类的无参构造方法(super()),如果父类只有有参构造方法,需要写子类的构造方法,否则会报错
// Person.java文件
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// Student.java文件
public class Student extends Person{
public Student() {
super("", 1);
}
}
// Teacher.java文件
public class Teacher extends Person{ //报错
}
? 举例3:构造方法中,调用用父类的构造方法或者自身的构造方法,只能调用一个,并且必须在第一行,否则会报错
// Person.java文件
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
Person() {
}
}
// Student.java文件
public class Student extends Person{
public Student() {
this("", 0);
}
public Student(String name, int age) {
super(name, age);
}
public Student(String name) {
this();
this("", 0); //报错
}
public Student(int age) {
super();
this(); // 报错
}
public Student(int age, String name) {
System.out.println("Student");
super(name, age);//报错
}
}
? private和get/set方法
? 一般用于类的属性。只有在本类中可以直接调用,其他类想要调用封装后的属性,通过get/set方法。
? 举例1:没有get/set方法
// Student.java文件
public class Student {
String name;
private int age;
public void study() {
System.out.println("name:" + name);
System.out.println("age:" + age);
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 11; // 报错
}
}
? 举例2:有get/set方法:通过set方法对属性进行赋值,通过get方法获取属性的值,set和get方法的命名规则:set+属性名开头大写加上驼峰原则,get+属性名开头大写加上驼峰原则
// Student.java文件
public class Student {
String name;
private int age;
public void study() {
System.out.println("name:" + name);
System.out.println("id:" + age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.setAge(11);
System.out.println(student.name);// 张三
System.out.println(student.getAge()); // 11
}
}
? 举例3:封装的好处,可以在set的方法中对数据进行处理
// Student.java文件
public class Student {
String name;
private int age;
public void study() {
System.out.println("name:" + name);
System.out.println("id:" + age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0 || age > 150) {
this.age = -1;
} else {
this.age = age;
}
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.setAge(-2);
System.out.println(student.getAge()); //-1
student.setAge(200);
System.out.println(student.getAge());//-1
student.setAge(18);
System.out.println(student.getAge());//18
}
}
? 继承为只能继承一个类,所有的类都默认继承Object类
? extends:继承关键字
? 举例1:Person为Student的父类,Student为Person的子类,
子类默认继承父类的属性和方法
//Person.java文件
public class Person {
String name;
int age;
public void getInformation() {
System.out.println("name:" + name + ",age:" + age);
}
}
//Student.java文件
public class Student extends Person{
}
//Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 18;
student.getInformation();//name:张三,age:18
}
}
? 举例2:父类中被private修饰的属性和方法无法被继承
//Person.java文件
public class Person {
String name;
int age;
private int id;
private void getInformation() {
System.out.println("id" + id + ",name:" + name + ",age:" + age);
}
}
// Student.java文件
public class Student extends Person{
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 18;
student.id = 1111;//报错
student.getInformation();//报错
}
}
? super:调用父类关键字
? 举例1:super可以调用父类的属性和方法
// Person.java文件
public class Person {
String name;
int age;
public void getAge() {
System.out.println("age:" + age);
}
}
// Student.java文件
public class Student extends Person{
int stuNum;
public void getStudentInformation() {
System.out.print("stuNum:" + stuNum + ",name:" + super.name + ",");
super.getAge();
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 18;
student.stuNum = 1;
student.getStudentInformation(); // stuNum:1,name:张三,age:18
}
}
? 重写:在继承的基础上实现,用于方法中,子类中的方法于父类的方法,方法中的修饰符,返回值,方法名,参数类型都一样,重写的方法前面加上@Override,表示重写,static修饰的不会被重写,例子看多态的举例2
? 举例1:
// Person.java文件
public class Person {
String name;
int age;
public void getInformation() {
System.out.print("person:");
System.out.println("name:" + name + ", age:" + age);
}
}
// Student.java文件
public class Student extends Person{
@Override
public void getInformation() {
System.out.print("student:");
System.out.println("name:" + name + ", age:" + age);
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 18;
student.getInformation(); // student:name:张三, age:18
}
}
? 在继承和重写的基础上实现的,声明为父类,实例化为子类,调用重写的方法,调用的是父类的重写方法
举例1:
// Person.java文件
public class Person {
public void getInformation() {
System.out.println("person");
}
}
// Student.java文件
public class Student extends Person{
@Override
public void getInformation() {
System.out.println("student");
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Person person = new Student();
person.getInformation(); // student
}
}
? 举例2:被static修饰的方法,不会被重写
// Person.java文件
public class Person {
public static void getInformation() {
System.out.println("person");
}
}
// Student.java文件
public class Student extends Person{
public static void getInformation() {
System.out.println("student");
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Person person = new Student();
person.getInformation(); // person
}
}
? 举例3:声明为父类,实例化为子类,声明的父类不能调用子类特有的属性和方法,要想调用子类特有的属性和方法,强制转化即可。
// Person.java文件
public class Person {
public void getInformation() {
System.out.println("person");
}
}
// Student.java文件
public class Student extends Person{
String mainSubject = "语文,数学,英语";
@Override
public void getInformation() {
System.out.println("student");
}
public void study() {
System.out.println("study");
}
}
// Application.java文件
public class Application {
public static void main(String[] args) {
Person person = new Student();
person.getInformation(); // student
System.out.println(((Student)person).mainSubject);// 语文,数学,英语
((Student)person).study();// study
}
}
原文:https://www.cnblogs.com/longma-ling/p/14600695.html