基本概念
package com.itheima.di_staticdemo.d6;
public class A {
//公开成员
public int i;
public void print1()
{
System.out.println("====print1====");
}
//私有成员
private int j;
private void print2()
{
System.out.println("===printf2===");
}
}
//B称为子类,A为父类
public class B extends A {
//子类能继承父类的非私有的成员
public void print3()
{
System.out.println(i);
print1();
// 私有 System.out.println(j);
// print2();
}
}
public class Test1 {
public static void main(String[] args) {
B b = new B();//b对象是多张设计图做出来的,可以访问多张设计方法
}
}
public class People {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Teacher extends People {
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public void printInfo()
{
System.out.println(getName() + "具备的技能" + skill);
}
}
public class Test {
public static void main(String[] args) {
Teacher t =new Teacher();
t.setName("刘翀羽");
t.setSkill("java Spring");
System.out.println(t.getName());
System.out.println(t.getSkill());
t.printInfo();
}
}
权限修饰符
public class Fu {
//1,私有,只能在本类中访问
private void privateMethod()
{
System.out.println("==private===");
}
//2,缺省,本类,同一个包下的类
void method()
{
System.out.println("==缺省==");
}
//3,protected 本类,同一个包下的类,任意包下的子类
protected void protectedMothod()
{
System.out.println("==protected====");
}
//4,public 本类,同一个包下的类,任意下包下的子类,任意包下的任意类
public void publicMothod()
{
System.out.println("==public===");
}
public void test()
{
}
}
super
this:代表本类对象的引用(this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字所以我们常说this代表本类对象的引用)
super:代表父类存储空间的标识(可以理解为父类对象引用)
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
this | this.成员变量 访问本类成员变量 | this(...) 访问本类构造方法 | this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 | super(...) 访问父类构造方法 | super,成员方法(...) 访问父类成员方法 |
单继承与Object
注上面这张照片中a的方法就是object
方法重写
public class A {
public void print1()
{
System.out.println("111");
}
public void print2(int a,int b)
{
System.out.println("111111");
}
}
public class B extends A{
//方法重写
public void print1()
{
System.out.println("666");
}
//方法重写
public void print2(int a,int b)
{
System.out.println("666666");
}
}
public class Test {
public static void main(String[] args) {
//方法重写就近原则b对象就先执行打印6
B b =new B();
b.print1();
b.print2(2,3);
}
}
核心:声明不变,重新实现
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString快捷方式
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
//方法重写就近原则b对象就先执行打印6
B b =new B();
b.print1();
b.print2(2,3);
System.out.println("---------------------");
Student s =new Student("波妞",19);
System.out.println(s.toString());
System.out.println(s);
}
}
子类中访问其他成员的特点
在子类中访问其他成员(成员变量,成员方法),是依照就近原则的
public class F {
String name ="父类名字";
public void print1()
{
System.out.println("==父类的print1方法执行==");
}
}
问题:关于下面的 this使用原理
public class Z extends F{
String name="子类名称";
public void showName()
{
String name="局部名称";
System.out.println(name);//局部名称
System.out.println(this.name);//子类成员变量(访问子类成员变量
System.out.println(super.name);//父类成员变量
}
@Override
public void print1()
{
System.out.println("====子类的print1方法执行了=====");
}
public void showMethod()
{
print1();//就近就打印子类的print1方法执行了
super.print1();//父类中的print
}
}
public class Test {
public static void main(String[] args) {
Z z =new Z();
z.showName();
z.showMethod();
}
}
子类构造器的特点
子类的全部构造器,都会先调用父类的构造器,再执行自己。
class F{
// public F()
// {
// System.out.println("===父类的无参数构造器执行了==");
// }
// }
public F(String name ,int age)
{
}
}
class Z extends F{
public Z()
{
super("liucyu",18);//因为没有了无参构造器所以要使用有参去使用
//super();//默认存在,调用父类
System.out.println("===子类的无参数构造器执行了==");
}
public Z(String name)
{
super("12",11);
System.out.println("===子类的有参数构造器执行了==");
}
}
public class Test {
public static void main(String[] args) {
Z z =new Z();
Z z2 = new Z("刘翀羽");
}
}
先调用父类再是自己 用super可调用父类构造器
public class Test2 {
public static void main(String[] args) {
Teacher t =new Teacher("刘翀羽",19,"java");
System.out.println(t.getName());
System.out.println(t.getAge());
System.out.println(t.getSkill());
}
}
class Teacher extends People{
private String skill;
public Teacher(String name, int age, String skill) {
super(name, age);
this.skill = skill;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
class People{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public People() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
需求,若用户输入时没有输入学校,则学小默认为黑马程序员
public class Test2 {
public static void main(String[] args) {
Studnet s1= new Studnet("李四",26,"家里蹲大学");
//需求,若用户输入时没有输入学校,则学小默认为黑马程序员
Studnet s2 =new Studnet("李华",15);
}
}
class Studnet{
private String name;
private int age;
private String schoolName;
public Studnet(String name,int age)
{//关键;若用户输入时没有输入学校,则学小默认为黑马程序员
this.name=name;
this.age=age;
this.schoolName="黑马程序员";
}
public Studnet() {
}
public Studnet(String name, int age, String schoolName) {
this.name = name;
this.age = age;
this.schoolName = schoolName;
}
改进版
private String schoolName;
public Studnet(String name,int age)
{
this(name,age,"黑马程序员");
}
注:this()与super()不能同时出现在构造器中
public Studnet(String name, int age, String schoolName) {
this(name,age,schoolName);
}
//直接单独使用会报错,只有当是兄弟构造器才可以使用this()