Java基础(面向对象一)
方法重载:
方法名相同,接收参数不同(类型或数量),程序可根据调用方法时传入的参数类型跟数量判断究竟使用哪个方法。
封装:
使用private/protected使类的变量与方法不能在类外直接调用,同时定义部分API达到修改或获取目标变量的方法。
为了防止属性名与方法参数名重复,方法中访问属性名时可用this.属性名=参数,this指向当前实例。
构造方法:
方法名同类名相同,无返回值,可直接在新建实例时传入参数从而创建一个完整实例。
一个类若没有定义构造方法时,编译器会自动为类生成一个无参数的构造方法。
构造方法可重载,故同一个类可定义多个构造方法。
public class B { private String name; public B(){ } public B(String name){ this.name = name; } public void getName(){ System.out.println(this.name); } }
继承:
class A extends B{ ... }
子类无法访问父类中用private修饰的变量,可使用protected修饰符保证本类及子类可以访问到某些变量(类外无法直接调用)。
可向上转型,转型后无法访问子类中的特有属性与方法
构造方法:
继承时子类不会自动继承父类的构造方法,编译器会自动为子类生成一个无参数的构造方法。
若想继承父类的构造方法,可在子类构造方法中使用super(args)来继承相应构造方法。
public class B { //private String name; protected String name; public B(){ } public B(String name){ this.name = name; } public void getName(){ System.out.println(this.name); } } public class A extends B { private int age; private char gender; public A(){ } public A(String name,int age,char gender){ super(name); this.age = age; this.gender = gender; } public void getMes(){ System.out.println("姓名:"+this.name+"年龄:"+this.age+"性别:"+gender); } }
多态:
类继承时,若子类中有方法与父类中所定义的方法方法名,参数列表,返回值均相同的话,被称为覆写(Override)。
若子类中有方法与父类中所定义的方法方法名,返回值均相同,参数列表不同的话,为方法重载。
若方法名,参数列表相同但返回值不同的话编译器会报错。
可在覆写方法前边加上@Overrid(不是必须)让编译器检查是都进行了正确的覆写。
若发生向上转型后调用被覆写的方法,执行的是子类中定义的方法(java中实例调用是基于运行时实际类型的调用)。
可通过覆写使不同类执行相同方法时达到不同输出的效果。
public class Demo { public static void main(String[] args) { Person p = new Person(); Student s = new Student(); Person p1 = new Student(); p.run(); s.run(); //会输出student的run方法,java中实例调用是基于运行时实际类型的调用 p1.run(); p1.getName(); System.out.println(s.getName("qwerty")); } } public class Person { public void run(){ System.out.println("Person.run"); } public void getName(){ System.out.println("Person.name"); } } public class Student extends Person { private String name = "longk"; //private String name; //如果方法签名不同就是Overload,如果方法签名相同 //@Override public void run(){ System.out.println(this.name); System.out.println("Student.run"); } public String getName(String sss){ System.out.println(this.name); return this.name; //return this.name; } }